package org.Yiran.timetale_re.item.gem.base;

import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.BlockTags;
import net.minecraft.tags.TagKey;
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.block.AmethystClusterBlock;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.DirectionProperty;
import net.minecraft.world.level.Level;
import org.Yiran.timetale_re.item.base.DescriptiveItem;
import org.jetbrains.annotations.NotNull;

/**
 * 宝石物品基类
 * <p>
 * 该类为所有宝石物品提供通用功能，包括右键放置方块的逻辑。
 * </p>
 */
public abstract class GemItemBase extends DescriptiveItem {
    
    /**
     * 构造函数
     * 
     * @param properties 物品属性
     */
    public GemItemBase(Properties properties) {
        super(properties);
    }
    
    /**
     * 右键使用物品
     * <p>
     * 当玩家手持宝石右键石头类方块时，可以在方块上种植对应的水晶方块
     * </p>
     *
     * @param context 使用上下文
     * @return 交互结果
     */
    @Override
    public @NotNull InteractionResult useOn(UseOnContext context) {
        // 获取世界、位置和方块状态
        var level = context.getLevel();
        var blockPos = context.getClickedPos();
        var blockState = level.getBlockState(blockPos);
        
        // 检查方块是否为石头类方块
        if (isStoneTypeBlock(blockState)) {
            return placeCrystalOnStone(context, level, blockPos);
        }
        
        return super.useOn(context);
    }
    
    /**
     * 在石头类方块上放置水晶
     *
     * @param context 使用上下文
     * @param level 世界对象
     * @param blockPos 方块位置
     * @return 交互结果
     */
    private @NotNull InteractionResult placeCrystalOnStone(UseOnContext context, 
                                                           Level level, 
                                                           BlockPos blockPos) {
        // 在客户端直接返回成功
        if (level.isClientSide()) {
            return InteractionResult.SUCCESS;
        }
        
        Player player = context.getPlayer();
        // 检查玩家是否为空（防止通过非玩家方式调用）
        if (player == null) {
            return InteractionResult.FAIL;
        }
        
        // 获取点击面的方向（即方块要附着的面）
        Direction direction = context.getClickedFace();
        
        // 计算水晶放置位置
        BlockPos crystalPos = blockPos.relative(direction);
        
        // 检查玩家是否允许在该位置放置方块
        if (!level.mayInteract(player, crystalPos)) {
            return InteractionResult.FAIL;
        }
        
        // 检查位置是否可以放置方块
        if (level.isEmptyBlock(crystalPos)) {
            return placeCrystalBlock(context, level, crystalPos, direction);
        }
        
        return InteractionResult.CONSUME;
    }
    
    /**
     * 放置水晶方块
     *
     * @param context 使用上下文
     * @param level 世界对象
     * @param crystalPos 水晶放置位置
     * @param direction 朝向
     * @return 交互结果
     */
    private @NotNull InteractionResult placeCrystalBlock(UseOnContext context, 
                                                         Level level, 
                                                         BlockPos crystalPos, 
                                                         Direction direction) {
        Player player = context.getPlayer();
        // 再次检查玩家是否为空
        if (player == null) {
            return InteractionResult.FAIL;
        }
        
        // 检查玩家是否允许在该位置放置方块
        if (!level.mayInteract(player, crystalPos)) {
            return InteractionResult.FAIL;
        }
        
        // 获取要放置的方块状态
        BlockState crystalState = getCrystalBlock().defaultBlockState()
                .setValue(getFacingProperty(), direction);
        
        // 在指定位置放置方块
        if (!level.setBlock(crystalPos, crystalState, 3)) {
            return InteractionResult.FAIL;
        }
        
        // 消耗一个物品（非创造模式下）
        if (!player.isCreative()) {
            context.getItemInHand().shrink(1);
        }
        
        return InteractionResult.CONSUME;
    }
    
    /**
     * 检查方块是否为石头类方块
     * <p>
     * 判断方块是否为石头或深板岩，用于确定是否可以种植水晶
     * </p>
     *
     * @param state 方块状态
     * @return 如果是石头类方块返回true，否则返回false
     */
    protected boolean isStoneTypeBlock(BlockState state) {
        return state.is(BlockTags.STONE_ORE_REPLACEABLES) || 
               state.is(BlockTags.DEEPSLATE_ORE_REPLACEABLES) ||
               state.is(BlockTags.BASE_STONE_NETHER) ||
               state.is(Blocks.END_STONE) ||
               state.is(Blocks.MAGMA_BLOCK);
    }
    
    /**
     * 获取要放置的水晶方块
     * 子类需要实现此方法来提供对应的方块
     * 
     * @return 水晶方块
     */
    protected abstract Block getCrystalBlock();
    
    /**
     * 获取朝向属性
     * 默认使用AmethystClusterBlock.FACING，子类可以重写
     * 
     * @return 朝向属性
     */
    protected DirectionProperty getFacingProperty() {
        return AmethystClusterBlock.FACING;
    }
}